home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CDsupport
/
HippoPlayer
/
ARexx
/
HippoPlay.filer
< prev
next >
Wrap
Text File
|
1994-05-27
|
18KB
|
477 lines
/* HippoPlayer ARexx script for Filer. (v 1.2) *
* ================================================================ *
* *
* Adds selected files into HiP's playlist and randomplays them. *
* If HiP isn't already running it is run first. *
* *
* If directories were selected this script recurses through all *
* subdirectories, so it is possible to add all your modules to *
* HiP's playing list just by selecting your module directory! *
* *
* If nothing was selected (user just pushed the button) then *
* we tell HiP to Random Play with it's current playlist unless *
* there's only one module in it, in which case we eject it. *
* But if the playlist is empty already we advice the user to *
* select a module before fooling around... *
* *
*------------------------------------------------------------------*
* NOTE! This script checks if a file has a suffix or prefix that *
* indicates something else than a module, for example "foo.info", *
* "program.readme" or ".backdrop". Unfortunately this also makes *
* the script noticeably slower, so this feature is disabled by *
* default. If you want to use it, see CONFIGURATION below. *
*------------------------------------------------------------------*
* *
* Version 1.2: now supports double-clicking of modules! This is *
* done by adding the following line to the end of your Filer.RC: *
* *
* CLASS "(mod|MED).#?","","RX HippoPlay.filer %f" *
* *
***** Requirements: rexxsupport.library, HiP, and Filer... ******
* Remember to replace the HippoPath variable below with the *
* correct path of HiP in your system! You might also want to set *
* HiP's screen to FilerScreen in the HiP-prefs, though this script *
* opens HiP on FilerScreen automatically anyway. *
* *
* Sorry for the messyness, especially in dirpart, but it works! :) *
* If it fails for you, contact me: *
* Janne Simonen - jsimonen@cc.joensuu.fi */
/* -------------------------------------------------------------------- */
/**** CONFIGURATION: change the following lines to suit your system! ****/
/* -------------------------------------------------------------------- */
HippoPath = 'dh2:HippoPlayer/Hip' /* Where to find HiP */
/* This flag controls the printing of extra information on FilerScreen. */
/* 0 = OFF, 1 = ON. If you don't have composers' names in filenotes and */
/* don't want to know how big the mod is, switch this off. */
Verbose = 1 /* Default: speak up! */
/* This flag turns filename checking on/off, 0 = OFF, 1 = ON */
CheckFileNames = 0 /* Default: don't check filenames for ".info"s etc. */
/* These suffixes/prefixes indicate that a file really is NOT a module! */
/* You can add your own, just remember to change crapnumbers accordingly*/
/* The more you add, the slower the script gets, so... */
IF ~(CheckFileNames = 0) THEN DO /* if checking is not disabled */
crapsufnumber = 3 /* number of crap suffixes */
crapsuffix.1 = '.info' /* disregard these suffixes */
crapsuffix.2 = '.readme'
crapsuffix.3 = '.doc'
crapprefnumber = 1 /* number of crap prefixes */
crapprefix.1 = '.' /* disregard these prefixes */
END
ELSE DO /* if checking is disabled then accept ALL files */
crap = 0 /* regardless of filename. Don't change this! */
END
/* Random play if nothing selected? If not then show modinfo */
RandPlay = 0
/* -------------------------------------------------------------------- */
/* ******************* MAIN PROGRAM STARTS HERE *********************** */
/* -------------------------------------------------------------------- */
OPTIONS RESULTS
PARSE ARG doubleclickname /* Read possible argument (double-clicked mod) */
SIGNAL ON IOERR /* Trap for IO-Errors (filehandling etc.) */
SIGNAL ON BREAK_C /* Trap for control-c break (doesn't work?) */
/********** Make sure HiP is running (with an open ARexx port) **********/
IF ~SHOW("Ports","HIPPOPLAYER") THEN DO
ADDRESS 'FilerRexx'
'STATUS Loading HippoPlayer...'
ADDRESS 'COMMAND' 'run >NIL: '||HippoPath
/* give HiP exactly 5 seconds time to emerge */
ADDRESS 'FilerRexx'
'STATUS Waiting for HippoPlayer to open its ARexx port...'
TIME('R')
DO WHILE ((TIME('E')<5) & (~SHOW("Ports","HIPPOPLAYER")))
END
IF ~SHOW("Ports","HIPPOPLAYER") THEN DO
ADDRESS 'FilerRexx'
"STATUS HippoPlayer didn't show up!"
EXIT
END
ADDRESS 'HIPPOPLAYER'
'PUBSCREEN FilerScreen' /* open HiP on FilerScreen */
'ZIP 0' /* and zip the window. */
END
/****************** Check if a file was double-clicked ******************/
IF ~( doubleclickname = "" ) THEN DO
/* remove possible '"'s from the file name, because they're */
/* automatically added by ARexx below. */
doubleclickname = COMPRESS( doubleclickname, '"' )
ADDRESS 'HIPPOPLAYER'
'CLEAR'
'ADD '||doubleclickname /* Add the mod to Hip's playlist */
Message = 'HiP: Adding module "'||doubleclickname||'" into playlist...'
IF LENGTH( Message ) < 67 THEN DO
Message = OVERLAY( 'Please wait!', Message, 68)
END
ADDRESS 'FilerRexx'
'STATUS '||Message /* tell user what's happening */
ADDRESS 'HIPPOPLAYER'
'CHOOSE 1'
'PLAY' /* tell hip to make some noise */
'GET PLAY' /* check if anything is playing */
IF RESULT = 0 THEN DO /* if not -> we're very sorry...*/
ADDRESS 'FilerRexx' /* ...probably out of memory */
"STATUS HiP: Sorry, can't play this one!"
END
EXIT /* Enough done, let's retire... */
END
/****** Open a lib to get SHOWDIR() to be used with directories ********/
CALL ADDLIB('rexxsupport.library', 0, -30, 0)
/********************* Give HiP the modules to play *********************/
ADDRESS 'FilerRexx'
/* Get source directory name, append "/" if it is not a device name */
GETSOURCEPATH
srcdir = RESULT
IF RIGHT( srcdir, 1 ) ~= ":" THEN srcdir = srcdir || "/"
GETNUMENTRIES /* get number of sourcedir entries */
numentries = RESULT
DO j = 1 TO numentries /* loop through all entries */
GETNAME j /* get jth entry */
entry = RESULT
type = LEFT( entry, 1 ) /* parse filetype (f, d, F, D) */
name = SUBSTR( entry, 2 ) /* parse filename */
SELECT /* it's either a file OR a directory*/
/* If entry is a selected FILE we add it to playlist */
WHEN type = 'f' THEN DO
IF CheckFileNames = 1 THEN DO /* if checking not disabled */
CALL FileCheck /* check if it's a module */
END
IF crap = 0 THEN DO /* if it is, then lets add... */
IF checkflag ~= 'TRUE' THEN DO /* if it's the first file to */
ADDRESS 'HIPPOPLAYER' /* add we clear the playlist */
'CLEAR'
checkflag = 'TRUE'
END
ADDRESS 'FilerRexx'
/* just finetuning the message..*/
Message = 'HiP: Adding module "'||name||'" into playlist...'
IF LENGTH( Message ) < 67 THEN DO
Message = OVERLAY( 'Please wait!', Message, 68)
END
'STATUS '||Message /* tell user what's happening */
ADDRESS 'HIPPOPLAYER'
'ADD '||srcdir||name /* add the file into playlist */
END /* IF - FileCheck */
ADDRESS 'FilerRexx'
TOGGLEENTRY j /* de-select */
END /* WHEN */
/* If entry is a DIRECTORY we scan it through and see what's in */
WHEN type = 'd' THEN DO
Dirname = srcdir||name
/* get a string containing the filenames separated with a '0a'x */
Filelist = SHOWDIR( Dirname, 'FILE', '0a'x )
/* if string not empty we append a '0a'x (to make things work...) */
IF Filelist ~= '' THEN Filelist = Filelist || '0a'x
CALL FileNameParser /* add all the files in the dir to playlist */
/* See if there are any SUBDIRECTORIES and scan them for files */
i = 1 /* recursion level */
CALL DirRecurser /* let's delve through the subdirectories */
ADDRESS 'FilerRexx'
TOGGLEENTRY j
END /* WHEN - DIRECTORY */
OTHERWISE /* ignore entries not selected */
END /* SELECT */
END /* DO j */
/* -------------------------------------------------------------------- */
/* Ok, we've scanned all selected files/dirs and added the files to */
/* playlist, now it's time to do some bonus stuff... */
/* -------------------------------------------------------------------- */
/* If no file (or module! FileNameCheck...) was selected then: */
IF checkflag ~= "TRUE" THEN DO
ADDRESS 'HIPPOPLAYER'
'GET NFIL' /* get number of files in playlist */
numberoffiles = RESULT
/* if only non-module files were selected then this helps us complain */
IF NameCheckFlag = 1 THEN numberoffiles = 0
IF numberoffiles = 1 THEN DO /* if it's one we eject the mod */
'CLEAR'
'EJECT'
ADDRESS 'FilerRexx'
'STATUS HiP: Ejected the only module in the playlist.'
EXIT
END
IF numberoffiles = 0 THEN DO /* Nothing playing? Let's complain */
ADDRESS 'FilerRexx'
'STATUS HiP: It might help if you selected a module to play! :)'
EXIT
END
IF RandPlay = 0 THEN
CALL DisplayStuff /* Show info if multiple entries in playlist*/
END
ADDRESS 'FilerRexx'
'STATUS HiP: Loading module, please wait...'
ADDRESS 'HIPPOPLAYER'
'GET NFIL' /* get number of files in playlist */
/* because RANDPLAY doesn't work */
IF RESULT = 1 THEN DO /* if there's only one file... */
'CHOOSE 1' /* ...at least not with HiP207. */
'PLAY'
END /* single file: let's play it. */
ELSE 'RANDPLAY' /* multiple files: Random Play. */
'GET PLAY' /* check if anything is playing */
playornot = RESULT
IF playornot = 0 THEN DO /* if not -> we're very sorry... */
ADDRESS 'FilerRexx' /* ...probably out of memory */
"STATUS HiP: Sorry, can't play this one!"
EXIT
END
DisplayStuff:
/* Now a mod is playing, so we just display some info on FilerScreen */
'GET NAME' /* get mod name so that we can show */
modname = RESULT /* it on Filer's statusbar */
IF modname = '' THEN DO /* if modname doesn't exist */
'GET CNAM' /* we simply use filename */
modname = RESULT
/* strip off any prefix (like mod.) */
/* a little fix for a bug in HiP207: CNAM gives path too! K-P? :) */
DivPos = max(lastpos(':', modname),lastpos('/', modname)) +1
modname = substr(modname, DivPos)
modname = substr(modname, lastpos('.', modname, 6) +1)
END /* IF */
modname = SPACE( modname, 1) /* remove extra spaces from name */
IF Verbose = 0 THEN DO /* if Verbose is switched off we */
ADDRESS 'FilerRexx' /* only tell the module's name */
'STATUS HiP: Playing "'||modname'"'
EXIT /* and exit.*/
END
'GET COMM' /* get filenote/comment because */
comment = RESULT /* I have the composer's name in it */
IF comment = '' THEN DO /* no comment? Then give type&size */
'GET TYPE' /* instead to have some chrome :) */
modtype = RESULT
'GET SIZE'
modsize = RESULT
comment = 'HiP: Playing '||modtype||' module "'||modname'"'
/* check that announcement fits on screen */
IF LENGTH( comment ) < 61 THEN DO
comment = comment || ', size '||modsize||' bytes'
END
/* announce what HiP is playing */
ADDRESS 'FilerRexx' /* with modtype and modsize */
'STATUS ' || comment
END /* IF */
ELSE DO
comment = 'by ' || comment /* announce with composer's name */
ADDRESS 'FilerRexx'
'STATUS HiP: Playing "'||modname||'" '||comment
END /* ELSE */
EXIT /* voilá! */
/* -------------------------------------------------------------------- */
/*************** END OF MAIN PROGRAM, SUBROUTINES FOLLOW ****************/
/* -------------------------------------------------------------------- */
FileNameParser:
/* Parses filenames from the string 'Filelist' and adds them to playlist*/
/* Gets the complete path from the variable 'Dirname'. */
/* Filelist looks like "file1'0a'xfile2'0a'xfile3'0a'xfile4'0a'x". */
DO WHILE POS( '0a'x, Filelist ) > 0 /* while we still have files */
Slashpos = POS( '0a'x, Filelist ) /* find the next separator */
name = LEFT( Filelist, Slashpos -1) /* extract filename */
IF CheckFileNames = 1 THEN DO
CALL FileCheck /* see if it is a module */
END
IF crap = 0 THEN DO /* if yes, add it to playlist: */
IF checkflag ~= 'TRUE' THEN DO /* if this is the first file */
ADDRESS 'HIPPOPLAYER' /* to add to playlist then */
'CLEAR' /* clear the list first */
checkflag = 'TRUE'
END
ADDRESS 'FilerRexx'
/* just finetuning the message..*/
Message = 'HiP: Adding module "'||name||'" into playlist...'
IF LENGTH( Message ) < 67 THEN DO
Message = OVERLAY( 'Please wait!', Message, 68)
END
'STATUS '||Message
ADDRESS 'HIPPOPLAYER'
'ADD '||Dirname||'/'||name /* add the mod to playlist */
END /* IF - FileCheck */
/* Strip out added filename from string */
Filelist = SUBSTR( Filelist, Slashpos +1)
END /* WHILE */
RETURN /* END OF SUBROUTINE ----------------------------------------*/
DirRecurser:
/* Recurses through all the subdirectories of a directory, then */
/* calls FileNameParser to add the files in them into playlist. */
/* Get list of subdirectories */
Dirlist.i = SHOWDIR( Dirname, 'DIR', '0a'x)
IF Dirlist.i ~= '' THEN Dirlist.i = Dirlist.i || '0a'x
/* Go through the subdirs one by one, adding any files to playlist */
DO WHILE POS( '0a'x, Dirlist.i ) > 0
Slashpos = POS( '0a'x, Dirlist.i ) /* find the divider */
dname = LEFT( Dirlist.i, Slashpos -1) /* get subdirname */
Dirlist.i = SUBSTR( Dirlist.i, Slashpos +1) /* strip it off */
Dirnamebak.i = Dirname /* take backup of Dirname */
Dirname = Dirname || '/' ||dname /* make subdirectorypath */
Filelist = SHOWDIR( Dirname, 'FILE', '0a'x) /* make filelist */
IF Filelist ~= '' THEN Filelist = Filelist || '0a'x
CALL FileNameParser /* add any files in subdir to playlist */
i = i + 1 /* increase recursion level */
CALL DirRecurser /* call subroutine itself recursively */
i = i - 1 /* decrease recursion level */
Dirname = Dirnamebak.i /* get back saved Dirname */
END
RETURN /* END OF SUBROUTINE -----------------------------------*/
FileCheck:
/* Checks if file clearly is not a module (.info .readme...) */
/* Gets the filename from a global variable called "name" */
/* If file is not a mod, returns crap = 1, else returns crap=0. */
/* Bad suf(/pre)fixes are stored in crapsuf(/pre)fix variable. */
a = 1
DO WHILE a < (crapsufnumber+1)
/* Check suffix */
IF RIGHT( name, LENGTH( crapsuffix.a ) ) = crapsuffix.a THEN DO
crap = 1 /* file is not a module! */
NameCheckFlag = 1 /* a non-module file was found */
RETURN
END
a = a + 1
END
a = 1
DO WHILE a < (crapprefnumber+1)
/* Check prefix */
IF LEFT( name, LENGTH( crapprefix.a ) ) = crapprefix.a THEN DO
crap = 1 /* file is not a module! */
NameCheckFlag = 1 /* a non-mod was selected */
RETURN
END
a = a + 1
END
crap = 0 /* file passed the check - it's no crap! :) */
RETURN /* END OF SUBROUTINE -------------------------------*/
IOERR: /* I/O-Error trap, not tested, might even work... */
ADDRESS 'FilerRexx'
'STATUS HiP: Sorry, an I/O-error has occurred on line '||SIGL||'!'
'ALERTBOX I/O error - something is wrong!|File "'||name||'" was being processed.'
EXIT
BREAK_C: /* Break trap, never had this work... */
ADDRESS 'FilerRexx'
"STATUS HiP: Break request detected - I won't play anything!"
'NONE'
EXIT